Security Hubの脅威検出をAmazon Managed Grafanaで可視化してみた
クラウド事業本部の梶原@福岡オフィスです。
AWS公式ブログ「Detect and respond to security threats in near real-time using Amazon Managed Grafana」を参考に、実際に環境を構築してみましたので、その手順とカスタマイズした内容などを共有したいと思います。
作成するGrafana Dashboard
はじめに
AWSではセキュリティを最優先事項("job zero")として位置づけています。AWS環境のセキュリティ状態を一元的に監視・可視化できれば、脅威や脆弱性をより早く特定できます。
今回は、公式ブログで紹介されているAWS Security HubとAmazon Managed Grafanaを連携させる方法を実際に試してみました。
なるべく公式ブログと内容が重複しないようにしていますが、テンプレートファイル、ダッシュボードのJSONなどは、公式ブログから変更を加えており、同じものではありませんので、ご留意ください。
また、公式ブログではニアリアルタイムで検出、画面表示が更新されていますが、本ブログではコスト見合いで設定を1日1回に変更しています。リアルタイム性が必要な場合は、クローラーの設定などを調整してみてください。
アーキテクチャ概要
公式ブログの構成と同様に以下のアーキテクチャを構築しました。
主なコンポーネントは:
- AWS Security Hub: セキュリティ検出結果を集約
- Amazon EventBridge: 新規/更新された検出結果をトリガー
- AWS Lambda: 検出結果をJSON形式に変換
- Amazon S3: 変換されたデータを保存
- AWS Glue: データカタログ化
- Amazon Athena: S3データのクエリ実行
- Amazon Managed Grafana: ダッシュボード表示
事前準備
環境構築の前に以下の準備が必要となります。なお、Security Hub の統合設定、Amazon Managed Grafana の認証(AWS IAM Identity Center を使用) のため、Organizations環境下で構築しています。
- AWS Security Hubの有効化
- Security Hub管理者アカウントの設定
- リージョン間集約の有効化
- Amazon Athenaワークグループの設定
- Amazon Managed Grafanaワークスペースの作成
簡単にですが、設定手順、確認内容を記載します。
1. AWS Security Hubの有効化
集約したいアカウント毎にAWS Security Hubが有効化されていることを確認します。
手順
- AWS Management Consoleにログイン
- Security Hubのコンソールに移動
- 「Security Hubを有効化」ボタンをクリック
確認ポイント
- 有効化後、以下の画面が表示されることを確認
- なんらかセキュリティ標準が有効化されていることを確認
- AWS基礎セキュリティのベストプラクティス
- CIS AWS Foundations Benchmark
- PCI DSS
なお、各セキュリティ標準は必須ではないので、有効になっている事を確認してください。
2. Security Hub管理者アカウントの設定
手順
- Organizations管理アカウントにログイン
- Security Hubコンソールで「管理者アカウント」タブを選択
- 委任する管理者アカウントを選択
確認ポイント
- 委任された管理者アカウントに以下の権限があることを確認
- メンバーアカウントの招待/管理
- 集約された結果の表示
- セキュリティスコアの確認
3. リージョン間集約の有効化
手順
- Security Hubコンソールの設定に移動
- 「リージョン間集約」を選択
- 集約リージョンを選択(例:us-east-1)
- リンクするリージョンを選択
確認ポイント
- 集約リージョンに検出結果が表示されることを確認
4. Amazon Athenaワークグループの設定
手順
- Athenaコンソールに移動
- 「ワークグループ」を選択
- 以下の設定を行う
- ワークグループ名: primary
- クエリ結果の場所: s3://aws-athena-query-results-ap-northeast-1-XXXXXXXX/
- バケット所有者にクエリ結果に対する完全なコントロールを割り当てる ON
確認ポイント
- クエリ実行権限が正しく設定されていることを確認
- 結果出力用のS3バケットにアクセス可能なことを確認
- バケット所有者にクエリ結果に対する完全なコントロールを割り当てる
- Grafanaからクエリを実施した後に、結果を取得するために必要です
5. Amazon Managed Grafanaワークスペースの作成
手順
- Amazon Managed Grafanaコンソールに移動
- 「ワークスペースの作成」をクリック
- 以下の設定を行う
- ワークスペース名: SecurityMonitoring (何でもいいです)
- 認証方式: AWS IAM Identity Center
- サービスマネージドIAMロール: 有効化
- プラグイン管理をオンにする
- データソース
- Amazon Athena を選択
確認ポイント
- ワークスペースのステータスが「ACTIVE」になることを確認
- IAM Identity Centerでのユーザー認証が機能することを確認
- 必要なIAMロールとポリシーが作成されていることを確認
確認用チェックリスト
- Security Hubが正常に有効化されている
- 管理者アカウント(もしくは委任アカウント)で他アカウントの検出結果が表示される
- リージョン間の検出結果が正しく集約されている
- Athenaでテストクエリが実行できる
- Grafanaワークスペースにログインできる
これらの準備が整えば、次のステップであるCloudFormationテンプレートのデプロイに進むことができます。
構築手順
1. CloudFormationテンプレートのデプロイ
こちらのCloudFormationテンプレートを使用して、管理アカウントもしくは、委任アカウントに必要なリソースをデプロイします。
なお、公式ブログより以下の変更を行っています。
Glue Crawler
公式ブログではFindingsが検出されたタイミングでLambdaよりクローリングが予備だされていましたが、1日1回の実行に変更しています。また、タイミングによってはGrafanaでスキーマの不一致が検出されますので、クローリング時にスキーマとデータベースカタログの更新を実施しています。
SecurityHubGlueCrawler:
Type: AWS::Glue::Crawler
Properties:
Name: aws-securityhub
Role: !Ref SecurityHubGlueCrawlerRole
DatabaseName: aws-securityhub-db
Targets:
S3Targets:
- Path: !Ref AWSSecurityHubBucket
Schedule:
ScheduleExpression: "cron(0 15 * * ? *)"
SchemaChangePolicy:
UpdateBehavior: "UPDATE_IN_DATABASE"
Lambda関数
- Findingsが検出されるたびに、クローリングを呼び出していましたが、上記コスト見合いでクローリング開始関数
start_crawler()
をコメントアウトしています。 - なお、ニアリアルタイムで検出したい場合は、更新が必要ですので、コメントアウトを外し、クローリングを行ってください。
Athena 名前付きクエリ
- LinkedAccountId を AccountId としています。
- Grafanaダッシュボードでの参照と調整しました。
- Created_At を CreatedAt としています。
- Grafanaダッシュボードでの参照と調整しました。
- テーブルの
${AWS::Region}
参照箇所- AthenaでGlueでテーブルが作成される際は-は_で変換され、テーブル作成が失敗しますので、調整しました。
2. Amazon Athenaでビューの作成
デプロイが正常に行われると、Athenaに保存されたクエリがありますので実行して、security_hub_findings
ビューを作成します。
- 保存したクエリを選択
- ワークグループを確認
- データベースを確認
- クエリを実行してください
- 正常に実行されるとsecuriy_hub_findings のビューが作成されます。
3. Grafanaでデータソース設定
Amazon Athenaをデータソースとして設定します。
- プラグインのページよりAmazon Athena をインストールします
- 「Add new datasouce」 を選択し、データソースを設定します
- default のトグルをON
- Datasource AwsDataCatalog
- Database aws-security-db
- Workgroup primary
- Output Location s3://grafana-athena-query-result-xxxxxx/
4. ダッシュボードの作成
こちらのJSONファイルをインポートしてダッシュボードを作成します。
なお、公式ブログのJSONよりいくつか調整を行っています。
-
Dashboards よりNew -> Importを選択
-
DownloadしたJSONファイルをUpLoadしてください
クエリ範囲をダッシュボードの設定から取得
$__timeFilter(createdat)
を使って、Where 句を絞り込んでいます。
日付処理を修正
動作確認
ダッシュボードが表示されることを確認してください。なお、公式ブログでは最新の検出に追従するようになっていますが、Glueの課金を抑えるために、1日1回としていますので、Lambdaでクローラを呼ぶ、もしくは、実行回数の設定を見直してください。
動かないときは
Dashborad 上のグラフよりEdit を選択し、クエリーを確認してください
該当するクエリーをGrafana上で実施、もしくは、Athenaじょうのクエリーを実施して、エラー内容を確認して、権限等を修正してください
まとめ
公式ブログの内容を実際に試してみることで、AWS Security HubとAmazon Managed Grafanaの連携させて、可視化させることができました。
Athenaとの連携設定などつまづく部分もありましたが、AWS Security Hubの検出状況がGrafanaで可視化でき、イマドキなダッシュボードだなと思いました。
必要なダッシュボードなども、追加カスタマイズできますので、有用なダッシュボードができたらまた共有したいと思います。
また、今回は Amazon Managed Grafanaで作成しましたが、Organizations環境が用意できない場合(SAML, IAM Identity Center での認証が用意できない場合)Grafana Cloudでも同様に作成できますので、機会があれば、試したいと思います。
補足ですが、SecurityHubの情報をGrafanaから直接参照しているわけではなく、検出した内容をS3に保存して、そのデータを可視化していますので、AWSコンソールのSecurityHubの集計とは一致しない場合はありますのでご留意ください。